﻿using log4net;
using System.Reflection;  
using PcaCore.DAL;
using PcaPagos.BOL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PcaPagos.DAL
{
    public class dRegistro
    {
        private static ILog log = LogManager.GetLogger(typeof(dRegistro));

        #region Public

        public static long Insert(oRegistro registro)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_add_registro
                //(
                //    varchar,--empresa_id $1
                //    varchar,--oficina_id $2
                //    bigint,--grupo_movimiento_id $3
                //    bigint,--subgrupo_movimiento_id $54
                //    bigint,--sesion_id $5
                //    date,--fecha_emision $6
                //    date,--fecha_vencimiento $7
                //    date,--fecha_alerta $8
                //    varchar,--tipo_comprobante_id $9
                //    varchar,--strserienumero $10
                //    varchar,--usuario_registro_id $11
                //    varchar,--medio_pago_id $12
                //    varchar,--detalle $13
                //    varchar,--moneda_id $14
                //    numeric,--monto $15
                //    boolean,--cancelado $16
                //    timestamp with time zone --fecha_hora_cancelacion $17
                //)RETURNS bigint
                object id = Core.ExecuteScalar("pca_pagos.fn_add_registro",
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.empresa_id),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.oficina_id),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registro.grupo_movimiento_id),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registro.subgrupo_movimiento_id),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registro.sesion_id),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Date, registro.fecha_emision),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Date, registro.fecha_vencimiento),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Date, registro.fecha_alerta),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.tipo_comprobante_id),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.strserienumero),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.usuario_registro_id),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.medio_pago_id),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.detalle),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.moneda_id),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Numeric, registro.monto),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Boolean, registro.cancelado),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.TimestampTZ, registro.fecha_hora_cancelacion));

                return Convert.ToInt64(id);  
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Update(oRegistro registro)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_update_registro
                //(
                //    varchar,--empresa_id $1
                //    varchar,--oficina_id $2
                //    bigint,--registro_id $3
                //    bigint,--grupo_movimiento_id $4
                //    bigint,--subgrupo_movimiento_id $5
                //    bigint,--sesion_id $6
                //    date,--fecha_emision $7
                //    date,--fecha_vencimiento $8
                //    date,--fecha_alerta $9
                //    varchar,--tipo_comprobante_id $10
                //    varchar,--strserienumero $11
                //    varchar,--usuario_actualiza_id $12
                //    varchar,--moneda_id $13
                //    numeric --monto $14
                //)RETURNS void
                Core.ExecuteNonQuery("pca_pagos.fn_update_registro",
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.empresa_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.oficina_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registro.registro_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registro.grupo_movimiento_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registro.subgrupo_movimiento_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registro.sesion_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Date, registro.fecha_emision),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Date, registro.fecha_vencimiento),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Date, registro.fecha_alerta),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.tipo_comprobante_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.strserienumero),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.usuario_actualiza_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, registro.moneda_id),
                                    new oParametro(NpgsqlTypes.NpgsqlDbType.Numeric, registro.monto));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Pagar(string empresaId,
                                 string oficinaId,
                                 long registroId,
                                 string medioPagoId,
                                 string detalle,
                                 DateTime fechaHoraCancelacion)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_pagar_registro
                //(
                //    varchar,--empresa_id $1
                //    varchar,--oficina_id $2
                //    bigint,--registro_id $3
                //    varchar,--medio_pago_id $4
                //    varchar,--detalle $5
                //    timestamp with time zone --fecha_hora_cancelacion $6
                //)RETURNS void
                Core.ExecuteNonQuery("pca_pagos.fn_pagar_registro",
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registroId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, medioPagoId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, detalle),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.TimestampTZ, fechaHoraCancelacion)); 
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void CancelarPago(string empresaId,
                                        string oficinaId,
                                        long registroId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_cancelar_pago
                //(
                //    varchar,--empresa_id $1
                //    varchar,--oficina_id $2
                //    bigint --registro_id $3
                //)RETURNS void
                Core.ExecuteNonQuery("pca_pagos.fn_cancelar_pago",
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registroId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Delete(string empresaId,
                                  string oficinaId,
                                  long registroId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_del_registro
                //(
                //    varchar,--empresa_id $1
                //    varchar,--oficina_id $2
                //    bigint --registro_id $3
                //)RETURNS void
                Core.ExecuteNonQuery("pca_pagos.fn_del_registro",
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registroId)); 
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static oVwRegistro Get(string empresaId,
                                      string oficinaId,
                                      long registroId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_get_registro
                //(
                //    varchar,--empresa_id $1
                //    varchar,--oficina_id $2
                //    bigint --registro_id $3
                //)RETURNS SETOF pca_pagos.vw_registros
                return Core.GetObjectDb<oVwRegistro>("pca_pagos.fn_get_registro",
                                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, registroId)); 
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwRegistro> GetList(int start,
                                                int limit,
                                                out int totalRecords,
                                                string empresaId,
                                                string oficinaId,
                                                string filtro)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_get_list_registros
                //(
                //    integer,--start $1
                //    integer,--limit $2
                //    varchar,--empresa_id $3
                //    varchar,--oficina_id $4
                //    varchar --filtro $5
                //)RETURNS SETOF refcursor
                return Core.GetListObjecstDb<oVwRegistro>("pca_pagos.fn_get_list_registros",
                                                          out totalRecords,
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, filtro));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwRegistro> GetList(int start,
                                                int limit,
                                                out int totalRecords,
                                                string empresaId,
                                                string oficinaId,
                                                string filtro,
                                                bool cancelado)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_get_list_registros
                //(
                //    integer,--start $1
                //    integer,--limit $2
                //    varchar,--empresa_id $3
                //    varchar,--oficina_id $4
                //    varchar,--filtro $5
                //    boolean --cancelado $6
                //)RETURNS SETOF refcursor
                return Core.GetListObjecstDb<oVwRegistro>("pca_pagos.fn_get_list_registros",
                                                          out totalRecords,
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, filtro),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Boolean, cancelado));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwRegistro> GetListVencidos(int start,
                                                        int limit,
                                                        out int totalRecords,
                                                        string empresaId,
                                                        string oficinaId,
                                                        string filtro)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_get_list_registros_vencidos
                //(
                //    integer,--start $1
                //    integer,--limit $2
                //    varchar,--empresa_id $3
                //    varchar,--oficina_id $4
                //    varchar --filtro $5
                //)RETURNS SETOF refcursor
                return Core.GetListObjecstDb<oVwRegistro>("pca_pagos.fn_get_list_registros_vencidos",
                                                          out totalRecords,
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                          new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, filtro));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static long GetTotalVencidosEmpresa(string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_get_count_vencidos_empresa
                //(
                //    varchar --empresa_id $1
                //)RETURNS bigint
                object total = Core.ExecuteScalar("pca_pagos.fn_get_count_vencidos_empresa",
                                                  new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId));

                return Convert.ToInt64(total);
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static long GetTotalVencidosOficina(string empresaId,
                                                     string oficinaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_get_count_vencidos_oficina
                //(
                //    varchar,--empresa_id $1
                //    varchar --oficina_id $2
                //)RETURNS bigint
                object total = Core.ExecuteScalar("pca_pagos.fn_get_count_vencidos_oficina",
                                                  new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                  new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId));

                return Convert.ToInt64(total);
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static long GetTotalPendientesEmpresa(string empresaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_get_count_pendientes_empresa
                //(
                //    varchar --empresa_id $1
                //)RETURNS bigint
                object total = Core.ExecuteScalar("pca_pagos.fn_get_count_pendientes_empresa",
                                                  new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId));

                return Convert.ToInt64(total);  
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static long GetTotalPendientesOficina(string empresaId,
                                                     string oficinaId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_pagos.fn_get_count_pendientes_oficina
                //(
                //    varchar,--empresa_id $1
                //    varchar --oficina_id $2
                //)RETURNS bigint
                object total = Core.ExecuteScalar("pca_pagos.fn_get_count_pendientes_oficina",
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId));

                return Convert.ToInt64(total);  
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        #endregion
    }
}
